home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 001-025 / disk_010 / fixobj / fixobj.c < prev   
C/C++ Source or Header  |  1992-05-06  |  2KB  |  71 lines

  1. /* FIXOBJ : cleanup routine for Amiga Object files (c) 1985 John Hodgson
  2.  
  3.    Note : FIXOBJ attempts to remove last record filler by truncating all
  4.    information past the last HUNK_END, providing the HUNK_END sequence
  5.    is within the last 128-byte record. The algorithm used here could be
  6.    thwarted if end-of-file filler happens to contain a bogus HUNK_END, or
  7.    if a particular load file ends with anything besides HUNK_END.
  8. */
  9.  
  10. #include <lattice/stdio.h>
  11.  
  12. /* constant definitions */
  13.  
  14. #define MAX16 (0xffff)
  15. #define REVHUNK_END (0xf203)
  16. #define BYTEBITS (8)
  17. #define ENDOFFSET (2)
  18.  
  19. main(argc,argv)
  20. int argc;
  21. char *argv[];
  22. {
  23.   FILE *rdptr,*wrtptr,*fopen();
  24.   int pos;
  25.   unsigned int media;
  26.   long ctr;
  27.  
  28.  
  29.   if (argc!=3) {
  30.     printf("Usage : fixobj srcfile destfile\n");
  31.     exit(0);
  32.   }
  33.   if ((rdptr=fopen(argv[1],"r"))==NULL) {
  34.     printf("Error opening file %s for reading.\n",argv[1]);
  35.     exit(0);
  36.   }
  37.  
  38. /* search last record backwards for HUNK_END combo in reverse order */
  39.  
  40.   media=0;
  41.   for (ctr=-1;ctr>-128;ctr--) {
  42.  
  43.     /* simulate a 16-bit shift register for easy hunk check */
  44.  
  45.     media=(media<<BYTEBITS)&MAX16;
  46.     fseek(rdptr,ctr,ENDOFFSET);
  47.     media|=getc(rdptr);
  48.     if (media == REVHUNK_END) break;
  49.   }
  50.   if ((media!=REVHUNK_END) || ctr==-2) {
  51.     (ctr==-2) ? printf("No corrections made!\n"):
  52.                 printf("Invalid load format!\n");
  53.     fclose(rdptr);
  54.     exit(0);
  55.   }
  56.   if ((wrtptr=fopen(argv[2],"w"))==NULL) {
  57.     printf("Error opening file %s for writing.\n",argv[2]);
  58.     fclose(rdptr);
  59.     exit(0);
  60.   }
  61.  
  62. /* duplicate file up to HUNK_END, inclusive */
  63.  
  64.   pos=ftell(rdptr)+1;
  65.   rewind(rdptr);
  66.  
  67.   for (ctr=0;ctr<pos;ctr++) putc(getc(rdptr),wrtptr);
  68.  
  69.   fclose(rdptr); fclose(wrtptr);
  70. }
  71.